
var app =require('./lib/app.js')
var User = require('./lib/userDB.js')
var Blog = require('./lib/blogDB.js')
var fomatTime = require('./lib/fomatTime.js')
var Reply = require('./lib/replyDB.js')

// 关于操作数据库的代码

// -------页面处理接口--------
app.get('/',(req,res)=>{
  // console.log(req.session.user)
  // res.render('index.html', {
  //   title: '欢迎来到我的博客',
  //   code:'index',
  //   user:req.session.user
  // })
  // 同时也进行从blog表提出所有的博客信息的数据，返给模板渲染
  // populate（表于表之间关联的字段） 进行数据表之间的联系
  Blog.find().populate('author').exec(function(err,data) {
    // 针对数据表中的所有的时间进行过滤操作，但是过滤后返回是String类型数据
    // 若是将过滤后的数据再次赋值给item.time,无法赋值成功,因为在blogDB中,对于time的接收数据类型定位:Number ,所以过滤后的String数据无法赋值
    // 解决此问题,两种方式:
    // 1. 将blogDB中的time的类型改为String
    // 2.将过滤后的数据存在返回数据对象中一个新的属性times中
    console.log(data)
    
    // 从数据库中获取数据,数据类型是不一致的,所以进行JSON转换
    var str = JSON.stringify(data)
    data = JSON.parse(str)
      data.forEach((item)=>{
        // console.log(item)
        item.times = fomatTime(item.time)
        // 对tag进行拆分
        item.tags=item.tag.split(' ');
      })
    //  console.log(fomatTime(1571369570453))
      res.render('index.html', {
        title: '欢迎来到我的博客',
        code:'index',
        user:req.session.user,
        blogs:data.reverse()
      })
  })
})

app.get('/login',(req,res)=>{
  res.render('login.html',{title:'用户登陆',code:'login'})
})
app.get('/register', (req, res) => {
  res.render('register.html',{title:'用户注册',code:"register"})
})

app.get('/publish',(req,res)=>{
  res.render('publish.html',{title:'发布新博客',code:'publish',user:req.session.user})
})

// 查看博客详情
app.get('/blog_detail',(req,res)=>{
  var _id = req.query.id
  Blog.findOne({_id},(err,data)=>{
    if(!err){
        //  进行阅读加1
        data.readNum++
        // 重新存储进数据库中
        data.save()
         // console.log(data)
         // 根据blog表中的用户id在user表找到对应的用户信息
         // 第一种方式:(适用1vs1,即 一个博客文章对应一个用户信息)
         // User.findOne({_id:data.author},(err,user)=>{
         //   if(!err){
         //      data.name = user.account
         //      res.render('blog_detail.html', {
         //       title: req.query.title,
         //       code: 'index',
         //       user: req.session.user,
         //       data
         //     })
         //   }
         // })
      // 第二种方式
      // console.log(data)
      // populate() 此方法是作用于数据库中表与表之间的关联查询,
      // 在此方法的()中放置的是两个表之间关联的字段名(是以主动去关联其他表(user)的数据表(blog)的字段),(bolg中与user关联的字段:author)
      var str = JSON.stringify(data)
      data = JSON.parse(str)
      // 博客时间过滤
      data.times = fomatTime(data.time)
      // 回复时间过滤
      data.reply.forEach((item)=>{
        item.times = fomatTime(item.time)
      })
      res.render('blog_detail.html', {
        title: req.query.title,
        code: 'index',
        user: req.session.user,
        data
      })  
    }else{
      console.log(err)
    }
  }).populate('author reply')
  // 或是 populate('author').populate('reply')
})

// 标签页
app.get('/tag',(req,res)=>{
  Blog.find((err,data)=>{
    var tags = []
    var str = JSON.stringify(data)
    data = JSON.parse(str)
    data.forEach((item)=>{
      item.tag = item.tag.split(' ');
      // 去重存到tags
      item.tag.forEach((t)=>{
        // 判断tags中的是否存在t
        if(tags.indexOf(t)<0){
          tags.push(t)
        }
      })
    })
    res.render('tag_list.html', {
      title: '标签列表',
      user: req.session.user,
      code: 'tag',
      tags
    })

  })

  
})


// --------数据处理接口-----

// ------------注册---------
app.post('/api/register',(req,res)=>{
  // console.log(req.body)
  // 1.先到User表中查找是否含有req.body.account的用户
  // User.findOne(查找的条件，回调函数))
  User.findOne({account:req.body.account},function(err,data){
    if(data){
      // 2.有，不做保存，直接返回，告诉用户:该用户名已经存在
      res.render('register.html',{title:'用户注册',code:'register',msg:'该用户已经存在',status:0})
    }else{
       // 3.没有，进行该用户数据的保存
       var u = new User(req.body)
       u.save(function(err){
         if(!err){
            res.render('register.html', {
              title: '用户注册',
              code: 'register',
              msg: '注册成功',
              status:1
            })
         }
       })
    }
  })
})

// --------------登陆--------------
app.post('/api/login',(req,res)=>{
  // 根据用户的名到对应User表中查看该用户是否已经注册过
  // req.body={account:'aaa',pwd:'12332'}
  User.findOne({account:req.body.account},(err,data)=>{
    if(data){
      // 有该用户的信息
      if(req.body.pwd == data.pwd){
        // 将用户名传递给客户端
        //  req.session.客户端接口的key=value
        // {user:data.account}
         req.session.user = data;
         res.redirect('/')
      }else{
        res.render('login.html', {
          title: '用户登陆',
          code: 'login',
          msg: '该用户密码错误'
        })
      }
    }else{
      res.render('login.html',{title:'用户登陆',code:'login',msg:'该用户未注册，请先注册'})
    }
  })
})

// ---------退出登陆-------
app.get('/api/outLogin',(req,res)=>{
  req.session.user = null
  res.redirect('/')
})

//------------接受发布的新博客数据进行存储----------------
app.post('/api/publish',(req,res)=>{
   req.body.time=new Date().getTime()
   req.body.author=req.session.user._id
   req.body.readNum = 0
  //  发布一个新的博客信息的回复都是为[]
   req.body.reply=[]
  //  console.log(req.body)
   var blog = new Blog(req.body)
   blog.save((err)=>{
     if(!err){
       res.send({msg:'发布成功',code:1})
     }else{
       res.send({msg:'发布失败',code:0})
     }
   })
}) 

// ----------留言区---------------
app.post('/api/reply',(req,res)=>{
  // 获取url后的参数,通过req.query
  // 获取表单的数据通过post
  // console.log(req.query)
   if(!req.session.user){
      res.redirect('/login')
   }else{
     Blog.findOne({_id:req.query.id},(err,data)=>{
       if(!err){
        //  将留言信息存入到reply表中
        var r = new Reply({
          account:req.session.user.account,
          content:req.body.content,
          time:new Date().getTime()
        })
        r.save((err)=>{
          if(!err){
            // 保存成功,就会生成回复的id
            // 将id存储到blog中找到对应的博客数据中
            // 往data中添加新的信息之后
            data.reply.push(r._id)
            // 注意:需要再次重新存储到数据库中
            data.save((err)=>{
              if(!err){
                res.redirect('/blog_detail?id='+data._id)
              }
            })
          }
        })

       }
     })

   }
})

// --------------------删除博客------------
app.get('/delete-blog', (req, res) => {
  // 将该博客对应的回复删除
  Blog.findOne({
    _id: req.query.id
  }, (err, data) => {
    if (!err) {
      data.reply.forEach((item) => {
        // console.log(item)
        Reply.findByIdAndRemove(item,(err)=>{})
      })
      // 将博客信息删除
      Blog.findByIdAndRemove(req.query.id, (err) => {
        if (!err) {
          // 成功
          res.redirect('/')
        } else {
          console.log(err)
        }
      })
    }
  })
})

// ----------------删除留言信息--------
// 本教室禁止任何有关游戏的东西
app.get('/delete-reply',(req,res)=>{
  // 删除了reply表中的数据
  Reply.findByIdAndRemove(req.query.id, (err) => {
    if (err) {
      console.log(err)
    } else {
      Blog.findOne({
        _id: req.query.blog_id
      }, (err, data) => {
        if (!err) {
          //删除数组中的元素
          // 1. pop() 最后删除一个元素
          // 2.shift() 删除第一个元素
          // 3.splice() 删除指定元素
          var index = data.reply.indexOf(req.query.id)
          data.reply.splice(index, 1)
          // 操作之后，要重新存回Blog
          data.save()
          res.redirect('/blog_detail?id=' + req.query.blog_id + '&title=' + req.query.title)
        }
      })
     
    }
  })
  // 删除Blog中的reply数组中的对应id

  
})

// ---------显示标签对应的博客信息-----
app.get('/tag_contet',(req,res)=>{
  var tag_content=[]
  var tag = req.query.tag
  Blog.find((err,data)=>{
    var str = JSON.stringify(data)
    data = JSON.parse(str)
    data.forEach((item)=>{
      if(item.tag.indexOf(tag)!=-1){
        tag_content.push(item)
      }
      item.times = fomatTime(item.time)
      // 对tag进行拆分
      item. tags= item.tag.split(' ');
    })
    res.render('index.html', {
      title: '欢迎来到我的博客',
      code: 'index',
      user: req.session.user,
      blogs: tag_content
    })
  
  })
})

app.listen(3001,()=>{
  console.log('服务开启.....')
})